// Project: go-learn-demo
// Package: funcybxb
// Description: 闭包有两种调用方式	1: addInt()() 2: addInt()
// Author: hy.bai
// Date: 2025-08-12 星期二 15:01

package funcybxb

import "fmt"

func TestAddInt() {
	// addInt函数的返回值是一个函数
	addFunc := addInt()
	fmt.Printf("addFunc变量的类型是:%T\n", addFunc)
	// 打印结果:addFunc变量的类型是:func() int
	fmt.Println("----------------------------")
	var r1 = addFunc()                  // 返回值就是num
	fmt.Println("第1次调用addFunc的值是:", r1) // num的值是:0，结果是1
	var r2 = addFunc()
	fmt.Println("第2次调用addFunc的值是:", r2) // num的值是:1，结果是2
	fmt.Println("----------------------------")
	fmt.Println("第1次直接调用的值是:", addInt()()) // num的值是:0，结果是1
	fmt.Println("第2次直接调用的值是:", addInt()()) // num的值是:0，结果是1
}

// 方法的返回值是匿名函数(函数签名包括：函数名,参数列表,返回值列表)
func addInt() func() int {
	// num变量就是函数内部的变量。
	var num int
	fmt.Println("addInt函数的返回值是一个函数") // 调用addInt函数时，执行。

	// 返回值类型是一个函数。
	return func() int {
		fmt.Printf("num的值是:%v \n", num)
		num += 1
		return num
	}
}
